<?php

/**
 * Предоставляет интерфейс к базе данных
 */
class DBController implements iDBController {
	
	private $engine = null;
	
	private static $instance = false;
	private static $countQueries = 0;
	
	/**
	 * Возвращает объект класса DBController
	 * @return DBController
	 */
	public static function getInstance () {
		if (self::$instance === false) {
			self::$instance = new DBController;
		}
		return self::$instance;
	}
	
	private function __construct () {}
	
	/**
	 * Загружает движок, реализующий интерфейс к базе данных
	 * @param string $engineName
	 */
	public function loadEngine ($engineName) {
		$engineClassFile = ENGINE_ROOT . '/classes/DBController/backend/' . $engineName . '.php';
		if (!file_exists ($engineClassFile)) {
			throw new CoreException (lang('error_backend_engine_not_exists',__CLASS__));
		}
		
		include ENGINE_ROOT . '/classes/DBController/backend/iDBControllerBackend.php';
		include $engineClassFile;
		
		$className = 'db_engine_' . $engineName;
		$this->engine = new $className;
		$this->engine->connect ();
	}
	
	/**
	 * Выполнить запрос к базе данных
	 * @param string $sQuery строка с запросом
	 * @param integer $insertId ссылка на переменную, которой будет присвоен идентификатор вставленной записи
	 * @return resource
	 */
	public function query ($sQuery, &$insertId = 0) {
		$this->checkEngine ();
		self::$countQueries++;
		return $this->engine->query ($sQuery, $insertId);
	}
	
	/**
	 * Аналог функции mysql_fetch_row
	 * @return array
	 */
	public function fetch_row ($resourse) {
		$this->checkEngine ();
		return $this->engine->fetch_row ($resourse);
	}
	
	/**
	 * Аналог функции mysql_fetch_array
	 * @return array
	 */
	public function fetch_array ($resourse) {
		$this->checkEngine ();
		return $this->engine->fetch_array ($resourse);
	}
	
	/**
	 * Аналог функции mysql_num_rows
	 * @return integer
	 */
	public function num_rows ($resourse) {
		$this->checkEngine ();
		return $this->engine->num_rows ($resourse);
	}
	
	/**
	 * Аналог функции mysql_data_seek
	 * @param integer $position
	 * @return void
	 */
	public function reset_pointer ($resourse, $position = 0) {
		$this->checkEngine ();
		return $this->engine->reset_pointer ($resourse, $position);
	}
	
	/**
	 * Начинает транзакцию
	 * @return void
	 */
	public function startTransaction () {
		$this->checkEngine ();
		$this->engine->startTransaction ();
	}
	
	/**
	 * Завершает транзакию
	 * @return void
	 */
	public function stopTransaction () {
		$this->checkEngine ();
		$this->engine->stopTransaction ();
	}
	
	/**
	 * Возвращает количество выполненных запросов к БД
	 * @return integer
	 */
	public static function getCountQueries () {
		return self::$countQueries;
	}
	
	/**
	 * Проверка движка
	 */
	private function checkEngine () {
		if ($this->engine === null) {
			throw new CoreException (lang ('error_db_engine_not_loaded',__CLASS__));
		}
	}

}